/**
 * 工厂方法模式:又称为工厂模式，也叫虚拟构造器模式或者多态工厂模式它属于类创建型模式。
 * 
 * 在工厂方法模式中，工厂父类负责定义创建产品对象的公共接口，而工厂子类则负责生成具体的产品对象，
 * 
 * 这样做的目的是将产品类的实例化操作延迟到工厂子类中完成，即通过工厂子类来确定究竟应该实例化哪一个具体产品类
 * 
 * 这样解释可能会有点抽象。
 */

// 安全模式创建工厂类
// 父类负责定义创建产品对象的公共接口

var Ball = function(type, name) {
  /**
   * 安全模式 Ball也可以运行处new Ball的效果
   */
  console.log('this::', this)
  if (this instanceof Ball) {
    var s = new this[type](name)
    return s
  } else {
    return new Ball(type, name)
  }
}

// 工厂原型中设置创建所有类型数据对象的基类
Ball.prototype = {
  baskerBall: function(name) {
    this.play = () => {
      console.log('我在打', name)
    }
  },
  footBall: function(name) {
    this.play = () => {
      console.log('我在踢', name)
    }
  },
  badmintonBall: function(name) {
    this.play = () => {
      console.log('我在打', name)
    }
  }
  // ......
}

var baskerBall = new Ball('baskerBall', '篮球')
baskerBall.play()

var footBall = new Ball('footBall', '足球')
footBall.play()

var badmintonBall = new Ball('badmintonBall', '羽毛球')
badmintonBall.play()

var bb = Ball('baskerBall', '哈哈哈')
bb.play()
